/**
 * 
 */
package com.pe.pgn.clubpgn.dao.impl;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.WizardArticuloDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpdArticulo;
import com.pe.pgn.clubpgn.domain.beans.BNArticulo;


/**
 * @author Edwin Farfan
 *
 */
@Repository("wizardDao")
public class WizardArticuloDaoImpl extends GenericDaoHibernate<ClpdArticulo, Long> implements WizardArticuloDao {

	
	private WizardArticuloDaoImpl() {
		super(ClpdArticulo.class);
	}
	
	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	
	@SuppressWarnings("unchecked")
	public List<Map<String, Object>> buscarArticulos(String deArticulo,
			String coCodigoArticulo, Long coCategoria, String stArticulo,
			String stManejaStock, String stManejaSerie) {
		
		StringBuffer query = new StringBuffer();	
		query.append("select a.id as id, ");
		query.append("		a.de_articulo as deArticulo, ");
		query.append("		a.co_codigo_articulo as coCodigoArticulo, ");
		query.append("		c.de_categoria as deCategoria, ");
		query.append("		a.st_maneja_stock_punto_canje as stManejaPuntoCanje, ");
		query.append("		a.st_maneja_stock_alm_principal as stManejaStockAlmPrincipal, ");
		query.append("		a.st_no_maneja_stock as stNoManejaStock, ");
		query.append("		a.st_instantaneo_normal as stInstantaneoNormal, ");
		query.append("		a.st_instantaneo_vale as stInstantaneoVale, ");
		query.append("		a.st_articulo as stArticulo, ");
		query.append("		a.va_stock_actual as vaStockActual, ");
		query.append("		a.va_stock_disponible as vaStockDisponible, ");
		query.append("		a.st_maneja_serie as stManejaSerie ");
		
		
		query.append("	from clpd_articulo a join clpb_categoria c on a.co_categoria = c.id ");
		query.append("	where 1 = 1 ");
		query.append("		and a.st_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		if(coCategoria.intValue() > 0){
			query.append("		and a.co_categoria = ").append(coCategoria);
		}
		
		if(StringUtils.isNotBlank(deArticulo)){
			query.append("		and upper(trim(a.de_articulo)) like '%").append(deArticulo.trim().toUpperCase()).append("%'");
		}
		
		if(StringUtils.isNotBlank(coCodigoArticulo)){
			query.append("		and upper(trim(a.co_codigo_articulo)) like '%").append(coCodigoArticulo.trim().toUpperCase()).append("%'");
		}
		
		if(StringUtils.isNotBlank(stManejaStock) 
				&& !stManejaStock.equalsIgnoreCase(CLPConstantes.CARACTER_GUION_NO_ESPACIOS)){
			
			if(stManejaStock.equalsIgnoreCase(CLPConstantes.ST_NO_MANEJA_STOCK)){
				query.append("		and a.st_no_maneja_stock = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else if(stManejaStock.equalsIgnoreCase(CLPConstantes.ST_MANEJA_STOCK_PUNTO_CANJE)){
				query.append("		and a.st_maneja_stock_punto_canje = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else if (stManejaStock.equalsIgnoreCase(CLPConstantes.ST_MANEJA_STOCK_ALMACEN_PRINCIPAL)){
				query.append("		and a.st_maneja_stock_alm_principal = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else if (stManejaStock.equalsIgnoreCase(CLPConstantes.ST_PREMIO_INSTANTANEO_NORMAL)){
				query.append("		and a.st_instantaneo_normal = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else if (stManejaStock.equalsIgnoreCase(CLPConstantes.ST_PREMIO_INSTANTANEO_VALE)){
				query.append("		and a.st_instantaneo_vale = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
		}
		if(StringUtils.isNotBlank(stManejaSerie) && !stManejaSerie.equalsIgnoreCase(CLPConstantes.CARACTER_GUION_NO_ESPACIOS)) {
			if(stManejaSerie.equalsIgnoreCase(CLPConstantes.ST_VERDADERO)){
				query.append("		and a.st_maneja_serie = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else
			query.append(" and a.st_maneja_serie = '").append(CLPConstantes.ST_FALSO).append("'");
		}

		List<Map<String,Object>> lista = findListOfMaps(query.toString(), null);		
		return lista;
	}

	
	
	@SuppressWarnings("unchecked")
	public List<Map<String, Object>> buscarArticulosDevolucion(
			String deArticulo, String coCodigoArticulo, Long coCategoria,
			String stManejaSerie, String stManejaStock, Long coAlmacen) {
		// Busqueda de Articulos para devoluciones por almacen.
		
		StringBuffer query = new StringBuffer();	
		query.append("select a.id as id, ");
		query.append("		a.de_articulo as deArticulo, ");
		query.append("		a.co_codigo_articulo as coCodigoArticulo, ");
		query.append("		c.de_categoria as deCategoria, ");
		query.append("		unidad.de_unidad_medida as deUnidadMedida, ");
		query.append("		a.st_maneja_stock_punto_canje as stManejaStockPuntoCanje, ");
		query.append("		a.st_maneja_stock_alm_principal as stManejaStockAlmPrincipal, ");
		query.append("		a.st_no_maneja_stock as stNoManejaStock, ");
		query.append("		a.st_instantaneo_normal as stInstantaneoNormal, ");
		query.append("		a.st_instantaneo_vale as stInstantaneoVale, ");
		query.append("		a.st_articulo as stArticulo, ");
		query.append("		a.va_stock_actual as vaStockActual, ");
		query.append("		a.va_stock_disponible as vaStockDisponible ,");
		query.append("		tac.co_almacen as coAlmacen ");
		query.append("	from clpd_articulo a ");
		query.append("      join clpb_categoria c on a.co_categoria = c.id ");
		query.append("      join clpd_unidad_medida unidad on a.co_unidad_medida = unidad.id ");
		query.append("      join clpm_stock_almacen_catalogo tac on a.id = tac.co_articulo ");
		 
		query.append("	where 1 = 1 ");
				
		query.append("		and a.st_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		
		
		if(coCategoria.intValue() > 0){
			query.append("		and a.co_categoria = ").append(coCategoria);
		}
		
		if(coAlmacen.intValue() > 0){
			query.append("		and  tac.co_almacen = ").append(coAlmacen);
		}
		
		if(StringUtils.isNotBlank(deArticulo)){
			query.append("		and upper(trim(a.de_articulo)) like '%").append(deArticulo.trim().toUpperCase()).append("%'");
		}
		
		
		if(StringUtils.isNotBlank(stManejaSerie) && !stManejaSerie.equalsIgnoreCase(CLPConstantes.CARACTER_GUION_NO_ESPACIOS)){
			query.append("		and a.st_maneja_serie = '").append(stManejaSerie).append("'");
		}
		
		if(StringUtils.isNotBlank(coCodigoArticulo)){
			query.append("		and upper(trim(a.co_codigo_articulo)) like '%").append(coCodigoArticulo.trim().toUpperCase()).append("%'");
		}
		
		if(StringUtils.isNotBlank(stManejaStock) 
				&& !stManejaStock.equalsIgnoreCase(CLPConstantes.CARACTER_GUION_NO_ESPACIOS)){
			
			if(stManejaStock.equalsIgnoreCase(CLPConstantes.ST_NO_MANEJA_STOCK)){
				query.append("		and a.st_no_maneja_stock = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else if(stManejaStock.equalsIgnoreCase(CLPConstantes.ST_MANEJA_STOCK_PUNTO_CANJE)){
				query.append("		and a.st_maneja_stock_punto_canje = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else if (stManejaStock.equalsIgnoreCase(CLPConstantes.ST_MANEJA_STOCK_ALMACEN_PRINCIPAL)){
				query.append("		and a.st_maneja_stock_alm_principal = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else if (stManejaStock.equalsIgnoreCase(CLPConstantes.ST_PREMIO_INSTANTANEO_NORMAL)){
				query.append("		and a.st_instantaneo_normal = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else if (stManejaStock.equalsIgnoreCase(CLPConstantes.ST_PREMIO_INSTANTANEO_VALE)){
				query.append("		and a.st_instantaneo_vale = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
		}
		
		query.append("		and tac.co_catalogo is null");
		query.append("		and tac.va_cantidad > 0");
	
		
		List<Map<String,Object>> lista = findListOfMaps(query.toString(), null);
		System.out.println("WizardArticuloDaoImpl buscarArticulosDevolucion: " + lista.size());
		return lista;
	}

	@SuppressWarnings("unchecked")
	public BNArticulo recuperaArticulo(String coCodigoArticulo,Long coAlmacen) {
			// Busqueda de Articulos para devoluciones por almacen.
			
			StringBuffer query = new StringBuffer();	
			query.append("select a.id as id, ");
			query.append("		a.de_articulo as deArticulo, ");
			query.append("		a.co_codigo_articulo as coCodigoArticulo, ");
			query.append("		c.de_categoria as deCategoria, ");
			query.append("		unidad.de_unidad_medida as deUnidadMedida, ");
			query.append("		a.st_maneja_stock_punto_canje as stManejaStockPuntoCanje, ");
			query.append("		a.st_maneja_stock_alm_principal as stManejaStockAlmPrincipal, ");
			query.append("		a.st_no_maneja_stock as stNoManejaStock, ");
			query.append("		a.st_instantaneo_normal as stInstantaneoNormal, ");
			query.append("		a.st_instantaneo_vale as stInstantaneoVale, ");
			query.append("		a.st_articulo as stArticulo, ");
			query.append("		a.va_stock_actual as vaStockActual, ");
			query.append("		a.va_stock_disponible as vaStockDisponible ,");
			query.append("		tac.co_almacen as deAlmacen ");
			query.append("	from clpd_articulo a ");
			query.append("      join clpb_categoria c on a.co_categoria = c.id ");
			query.append("      join clpd_unidad_medida unidad on a.co_unidad_medida = unidad.id ");
			query.append("      join clpm_stock_almacen_catalogo tac on a.id = tac.co_articulo ");
			 
			query.append("	where 1 = 1 ");
					
			query.append("		and a.st_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
			
			
			if(coAlmacen.intValue() > 0){
				query.append("		and  tac.co_almacen = ").append(coAlmacen);
			}
			
			
			if(StringUtils.isNotBlank(coCodigoArticulo)){
				query.append("		and upper(trim(a.co_codigo_articulo)) like '%").append(coCodigoArticulo.trim().toUpperCase()).append("%'");
			}
			
			
			query.append("		and tac.co_catalogo is null");
			query.append("		and tac.va_cantidad > 0");
			System.out.println(query.toString());
			List<BNArticulo> list = findListOfBeans(query.toString(), null, BNArticulo.class);
			
			if(!list.isEmpty()){
				return (BNArticulo)list.get(0);
			}else{
				return new BNArticulo();
			}
		}
	
	


	
}
